// 任务分组服务
import { getPrisma } from '../config/prisma.js';

/**
 * 创建任务分组服务
 * 处理创建新任务分组的业务逻辑
 * @param {number} userId - 用户ID
 * @param {string} name - 分组名称
 * @returns {Promise<Object>} 创建的分组数据
 */
async function createTaskGroup(userId, name) {
  try {
    const prismaClient = await getPrisma();
    console.log('正在为用户创建任务分组:', userId);
    
    // 1. 验证输入
    if (!name) {
      throw new Error('分组名称是必需的');
    }
    
    // 2. 在数据库中创建任务分组
    const taskGroup = await prismaClient.taskGroup.create({
      data: {
        userId: BigInt(userId),
        name: name
      }
    });
    
    console.log('任务分组创建成功，ID:', Number(taskGroup.id));
    
    // 3. 返回任务分组数据
    return {
      group_id: Number(taskGroup.id),
      name: taskGroup.name,
      created_at: taskGroup.createdAt.toISOString()
    };
  } catch (error) {
    console.error('任务分组服务中的数据库操作失败:', error.message);
    throw error;
  }
}

/**
 * 获取任务分组列表服务
 * 处理获取用户任务分组列表的业务逻辑
 * @param {number} userId - 用户ID
 * @returns {Promise<Array>} 任务分组列表
 */
async function getTaskGroups(userId) {
  try {
    const prismaClient = await getPrisma();
    console.log('正在从数据库获取用户任务分组:', userId);
    
    // 1. 从数据库获取任务分组
    const taskGroups = await prismaClient.taskGroup.findMany({
      where: {
        userId: BigInt(userId),
        deletedAt: null
      },
      orderBy: {
        createdAt: 'asc'
      }
    });
    
    console.log('找到', taskGroups.length, '个任务分组，用户:', userId);
    
    // 2. 返回任务分组数据
    return taskGroups.map(group => ({
      group_id: Number(group.id),
      name: group.name,
      is_default: group.isDefault,
      task_count: 0, // 在完整实现中，这将是分组中任务的数量
      created_at: group.createdAt.toISOString()
    }));
  } catch (error) {
    console.error('任务分组服务中的数据库操作失败:', error.message);
    throw error;
  }
}

/**
 * 更新任务分组服务
 * 处理更新任务分组信息的业务逻辑
 * @param {number} userId - 用户ID
 * @param {number} groupId - 分组ID
 * @param {string} name - 新的分组名称
 * @returns {Promise<Object>} 更新后的分组数据
 */
async function updateTaskGroup(userId, groupId, name) {
  try {
    const prismaClient = await getPrisma();
    console.log('正在数据库中更新任务分组。用户:', userId, '分组ID:', groupId);
    
    // 1. 验证输入
    if (!name) {
      throw new Error('分组名称是必需的');
    }
    
    // 2. 检查任务分组是否存在且属于用户
    const taskGroup = await prismaClient.taskGroup.findFirst({
      where: {
        id: BigInt(groupId),
        userId: BigInt(userId),
        deletedAt: null
      }
    });
    
    if (!taskGroup) {
      throw new Error('任务分组未找到或访问被拒绝');
    }
    
    // 3. 更新数据库中的任务分组
    const updatedTaskGroup = await prismaClient.taskGroup.update({
      where: {
        id: BigInt(groupId)
      },
      data: {
        name: name
      }
    });
    
    console.log('任务分组更新成功');
    
    // 4. 返回更新后的任务分组数据
    return {
      group_id: Number(updatedTaskGroup.id),
      name: updatedTaskGroup.name,
      updated_at: updatedTaskGroup.updatedAt.toISOString()
    };
  } catch (error) {
    console.error('任务分组服务中的数据库操作失败:', error.message);
    throw error;
  }
}

/**
 * 删除任务分组服务
 * 处理删除任务分组的业务逻辑
 * @param {number} userId - 用户ID
 * @param {number} groupId - 分组ID
 * @returns {Promise<void>}
 */
async function deleteTaskGroup(userId, groupId) {
  try {
    const prismaClient = await getPrisma();
    console.log('正在数据库中删除任务分组。用户:', userId, '分组ID:', groupId);
    
    // 1. 检查任务分组是否存在且属于用户
    const taskGroup = await prismaClient.taskGroup.findFirst({
      where: {
        id: BigInt(groupId),
        userId: BigInt(userId),
        deletedAt: null
      }
    });
    
    if (!taskGroup) {
      throw new Error('任务分组未找到或访问被拒绝');
    }
    
    // 2. 软删除数据库中的任务分组
    await prismaClient.taskGroup.update({
      where: {
        id: BigInt(groupId)
      },
      data: {
        deletedAt: new Date()
      }
    });
    
    console.log('任务分组删除成功');
  } catch (error) {
    console.error('任务分组服务中的数据库操作失败:', error.message);
    throw error;
  }
}

export default { createTaskGroup, getTaskGroups, updateTaskGroup, deleteTaskGroup };